package model

import (
	"fmt"
	"gitee.com/liumou_site/gf"
	"gitee.com/liumou_site/logger"
	"os"
	"path/filepath"
)

// RestoreSSH 用于恢复SSH服务的配置和状态。
// 该函数首先检查目标路径是否为目录，然后将备份文件复制到目标路径，
// 接着重载并重启SSH服务，最后检查SSH服务是否成功启动。
// 返回值为error类型，表示操作过程中遇到的错误，如果操作成功则返回nil。
func (i Info) RestoreSSH() error {
	if i.Debug {
		logger.Debug("RestoreSSH")
	}
	// 检查目标路径是否为目录
	f := gf.NewFile(i.Dst)
	f.IsDir()
	if !f.IsDirs {
		GetLanguageManager().Error("目标路径不是目录", "Target path is not a directory")
		return fmt.Errorf("target path is not a directory")
	}

	// 将备份文件复制到目标路径
	i.Cmd.RunShell("cp", "-rf", i.Dst, i.Source)
	if i.Cmd.Err != nil {
		GetLanguageManager().Error("复制备份文件到目标路径失败: ", "Failed to copy backup file to target path: ", i.Target)
		return fmt.Errorf("failed to copy backup file to target path: %s", i.Target)
	}
	// 在源路径内查找 sshd执行文件并创建软链接
	err := createSymlinkForSSHD(i.Source, "/usr/sbin/sshd")
	if err != nil {
		return err
	}
	GetLanguageManager().Info("SSH服务恢复成功", "Restore SSH service successfully.")
	return nil
}

// createSymlinkForSSHD 函数用于在指定的源路径中查找名为 "sshd" 的文件，并在目标路径创建指向该文件的软链接。
// 如果目标路径已存在软链接，则先删除旧的软链接，再创建新的软链接。
//
// 参数:
//   - sourcePath: 源路径，函数将在此路径下递归查找名为 "sshd" 的文件。
//   - linkPath: 目标路径，函数将在此路径创建指向 "sshd" 文件的软链接。
//
// 返回值:
//   - error: 如果函数执行过程中出现错误，则返回相应的错误信息；否则返回 nil。
func createSymlinkForSSHD(sourcePath, linkPath string) error {
	// 遍历源路径，查找名为 "sshd" 的文件
	err := filepath.Walk(sourcePath, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			GetLanguageManager().Error("遍历路径失败: ", "Failed to walk the path: ", err)
			return err
		}

		// 检查当前文件是否为 "sshd" 文件
		if !info.IsDir() && info.Name() == "sshd" {
			// 如果目标路径已存在软链接，则先删除旧的软链接
			if _, err = os.Stat(linkPath); err == nil {
				if err = os.Remove(linkPath); err != nil {
					GetLanguageManager().Error("删除旧软链接失败: ", "Failed to remove old symlink: ", err)
					return fmt.Errorf("failed to remove old symlink: %v", err)
				}
				GetLanguageManager().Info("旧软链接删除成功", "Old symlink removed successfully.")
			}
			// 创建新的软链接，指向找到的 "sshd" 文件
			if err = os.Symlink(path, linkPath); err != nil {
				GetLanguageManager().Error("创建软链接失败: ", "Failed to create symlink: ", err)
				return fmt.Errorf("failed to create symlink: %v", err)
			}
			GetLanguageManager().Info("软链接创建成功: %s -> %s", "Symlink created: %s -> %s", linkPath, path)
			return filepath.SkipDir // 找到目标文件后停止遍历
		}

		return nil
	})

	if err != nil {
		GetLanguageManager().Error("遍历路径时出错: ", "Error walking the path: ", err)
		return fmt.Errorf("error walking the path: %v", err)
	}
	GetLanguageManager().Info("软链接创建成功", "Symlink created successfully.")
	return nil
}
